package com.itheima.controller;

import com.itheima.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * 用于演示不同http请求参数的接收
 */
@RestController
public class ParamController {

    /**
     * Tomcat接收到浏览器的请求后,封装成HttpServletRequest对象和HttpServletResponse对象发送给前置控制器DispatcherServlet,再经由前置控制器调度浏览器访问的url对应的控制器Controller执行相应的方法,获取http请求参数,返回响应结果
     */

    //原生servlet代码
    //请求url: localhost:8080/simpleParam?name=王天培&age=123
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request) {

        String name = request.getParameter("name");
        String ageStr = request.getParameter("age");
        Integer age = Integer.parseInt(ageStr);

        System.out.println(name);
        System.out.println(age);
        //王天培
        //123

        return "ok";
    }

    //springboot方式
    //请求url: localhost:8080/simpleParam?name=王天培&age=123
    @RequestMapping("/simpleParam2")
    public String simpleParam2(String name, int age) {

        System.out.println(name);
        System.out.println(age);
        //王天培
        //123

        return "ok";
    }


    //springboot方式参数名不同时

    /*
     * @RequestParam：两个功能：
     * 1.指定方法参数名与浏览器传参对应关系
     * 2.有此注解的参数，由于该注解的required属性默认为true，浏览器必须给值，否则报错(可以将其设置为false，可传可不传)
     * ps: 一般不使用基本数据类型作为参数类型，因为如果没有传对应的参数，则tomcat处理为null，基本类型无法接收null值
     * 请求url: localhost:8080/simpleParam?name=王天培&age=123
     */

    /*此外:
    @RequestParam(defaultValue = "1")  注解@RequestParam的属性defaultValue用于在没有传请求参数(为null)时,为参数指定默认值
    */


    @RequestMapping("/simpleParam3")
    public String simpleParam3(@RequestParam(required = false, value = "name") String username, Integer age) {

        System.out.println(username);
        System.out.println(age);
        //王天培
        //123
        return "ok";
    }

    //接收pojo类型(POJO是指纯Java对象（Plain Old Java Object），它是一个普通的Java对象,就是实体类-带有getter,setter)
    //get请求url格式: localhost:8080/simplePojo?name=王天培&age=123&address.province=四川省&address.city=理塘
    @RequestMapping("/simplePojo")
    public String simplePojo(User user) {
        System.out.println(user.toString());
        //User{name='王天培', age=123, address=Address{province='四川省', city='理塘'}}
        return "ok";
    }

    //数组类型
    /*
    发起get请求时,url中参数:键同,值不同/请求url: localhost:8080/arrayParam?hobby=弹琴&hobby=编程&hobby=骑行&hobby=游泳
    或者 请求url: localhost:8080/arrayParam?hobby=1,2,3
    */
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby) {
        System.out.println(Arrays.toString(hobby));//[弹琴, 编程, 骑行, 游泳]
        return "OK";
    }

    //集合类型
    /*
     * @RequestParam  功能3：可以将参数识别为集合，而不看作POJO
     *
     * 请求url: localhost:8080/listParam?hobby=弹琴&hobby=编程&hobby=骑行&hobby=游泳
     *
     * 或者 请求url: localhost:8080/listParam?hobby=123,456,789
     *
     * */
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby) {
        System.out.println(hobby.toString());//[弹琴, 编程, 骑行, 游泳]
        return "OK";
    }

    //时间类型(由url中的字符串封装成Date/LocalDate对象,url中参数默认写成birthday=1998/03/28,通过制定匹配模式可以将分隔符换成-)
    //请求url: localhost:8080/dateParam?birthday=1998-03-28
    @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday) {
        System.out.println(birthday);
        //Sat Mar 28 00:00:00 CST 1998
        return "OK";
    }

    //接收json类型(封装成pojo对象)

    /**
     * 接收json数据，必须在参数前加  @RequestBody   参数类型为实体类POJO。springboot中的springMVC会自动转换赋值
     * 要求：
     * json中的键与实体类中的成员变量名  一致
     * <p>
     * json请求可以用get方式发起,也可以用post方式发起,通常如果数据较多,使用post方式,Json字符串放在请求体中(Postman中发post请求步骤:选择Post->Body->raw->Json->填写Json字符串)
     * <p>
     * 请求url: localhost:8080/jsonParam?name=jack&age=18&address.province=江苏&address.city=南京
     */

    /* json字符串:
     * {
     *     "name":"jack",
     *     "age":18,
     *     "address":{
     *         "province":"江苏",
     *         "city":"南京"
     *     }
     * }
     */
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user) {
        System.out.println(user);
        //User{name='jack', age=18, address=Address{province='江苏', city='南京'}}
        return "ok";
    }

    //路径参数
    //请求url: localhost:8080/pathParam/0123/wtp
    @RequestMapping("/pathParam/{id}/{name}")
    public String pathParam(@PathVariable Integer id, @PathVariable(value = "name") String name) {
        System.out.println(id);//123
        System.out.println(name);//wtp
        return "ok";
    }

    /*
     * 可以指定多个匹配路径，然后设置参数为非必要来实现"路径参数可变长"
     * http://localhost:8080/helloWorld/user/1/zhangsan
     * http://localhost:8080/helloWorld/user/1
     * http://localhost:8080/helloWorld/user
     */
    /*
    @RequestMapping(value = {"/user/{id}/{name}", "/user/{id}", "/user"})

    public User getUser(@PathVariable(value = "id", required = false) Integer id, @PathVariable(value = "name", required = false) String name) {

        if (id == null) {//默认值
            id = 1;
        }
        if (name == null) {
            name = "";
        }

        System.out.println("--------------:" + id + "," + name)
        User user = new User(id, name);

        return user;

    }
    */
}
